package com.bugs.activity;

import cn.hutool.core.collection.CollectionUtil;
import org.activiti.engine.*;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.List;

/**
 * 工作流流程的挂起与激活
 */
public class ActTestDemo {

    @Test
    public void suspend(){
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // 查询流程定义
        ProcessDefinition singleResult = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("demo01")
                .singleResult();
        // 判断是否被挂起  如果被挂起 则让其激活；激活 则进行挂起操作
        boolean suspended = singleResult.isSuspended();
        System.out.println("singleResult.getId()==== "+singleResult.getId());
        if(suspended){
            /**
             * 挂起  进行激活操作
             * 参数一：流程定义id
             * 参数二：是否激活
             * 参数三：激活时间
             */
            repositoryService.activateProcessDefinitionById(singleResult.getId(),
                    true,
                    null);
            System.out.println("流程激活成功");
        }else{
            /**
             * 激活  需要进行挂起操作
             * 参数一：流程定义id
             * 参数二：是否暂停
             * 参数三：暂停时间
             */
            repositoryService.suspendProcessDefinitionById(singleResult.getId(),
                    true,
                    null);
            System.out.println("流程已挂起");
        }

    }

    /**
     * 查询当前个人待执行的任务
     */
    @Test
    public void viewReDoTask(){
        // 工作流从启动开始  就会流转至 第一个 UserTask 节点，
        // 此时可以通过配置的 Assignee 查询指定的人的  一些待处理 任务信息
        String assignee = "manager";
        // 数据库连接配置操作
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据对应的流程 查询当前指定人的待处理任务信息
        TaskService taskService = defaultProcessEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("demo01") // 指定哪个流程图模板
                .taskAssignee(assignee) // 指定是谁负责待处理的任务
                .list();
        if(!CollectionUtil.isEmpty(list)){
            list.forEach(x->{
                System.out.println("流程实例 id "+x.getProcessInstanceId());
                System.out.println("任务 id "+x.getId());
                System.out.println("任务负责人 "+x.getAssignee());
                System.out.println("任务名称 "+x.getName());
                System.out.println("===========================================");
            });
        }
    }

    /**
     * 工作流的节点与状态的扭转
     */
    @Test
    public void doTask(){
        // 获取数据库的连接信息
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = defaultProcessEngine.getTaskService();

        // 完成当前节点的任务  并向下推进
        String taskId = "5002";
        taskService.complete(taskId);
    }

    /**
     * 指定流程实例的暂停与激活
     */
    @Test
    public void oneSuppendAndAct(){
        // 获取数据库的连接信息
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
        ProcessInstance singleResult = runtimeService.createProcessInstanceQuery()
                .processInstanceId("2501")
                .singleResult();
        // 当前实例流程对象是都被暂停
        boolean suspended = singleResult.isSuspended();
        // 流程定义id
        String id = singleResult.getId();
        if(suspended){
            // 被暂停  则进行激活操作
            runtimeService.activateProcessInstanceById(id);
            System.out.println("流程定义："+id+",已激活");
        }else{
            // 是激活状态  则进行暂停
            runtimeService.suspendProcessInstanceById(id);
            System.out.println("流程定义："+id+",已挂起");
        }
    }
}
